package com.yvon.service.demo.algorithm.offer;

/**
 * 表示数值的字符串
 *
 * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
 * https://doocs.gitee.io/leetcode/#/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9820.%20%E8%A1%A8%E7%A4%BA%E6%95%B0%E5%80%BC%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2/README
 *
 */
public class P20 {
    public static void main(String[] args) {
        Solution solution = new P20().new Solution();
        boolean number = solution.isNumber("+100");
        System.out.println(number);

    }

    class Solution {
        public boolean isNumber(String s) {
            if (s == null || s.length() == 0 ) {
                return false;
            }
            char[] chars = s.toCharArray();
            boolean findNum = false;
            // E e 是否出现过
            boolean findE = false;
            // 小数点是否出现过
            boolean findDot = false;
            for (int i = 0, n = chars.length; i < n; ++i) {
                // 出现 +/- 时，位置必须是在第 0 位，或者 e/E 的后面一位
                if (chars[i] == '+' || chars[i] == '-') {
                   if (i != 0 && chars[i -1] !='e' && chars[i -1] != 'E') {
                       return false;
                   }
                }else if (chars[i] >= '0' && chars[i] <= '9') {
                    findNum = true;
                //出现 . 时，在此之前不能出现 . 或者 e/E
                }else if (chars[i] == '.') {
                    if (findDot || findE) {
                        return false;
                    }
                    findDot = true;
                // 出现 e/E 时，前面不能出现 e/E，并且必须出现过数字
                }else if (chars[i] == 'e' || chars[i] == 'E'){
                    if (findE || !findNum) {
                        return false;
                    }
                    findE = true;
                    findNum = false;
                }else {
                    return false;
                }

            }
            return findNum;
        }
    }
}
